package com.common.android.utils;

import java.io.File;
import java.util.List;
import java.util.Locale;

import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Environment;
import android.text.TextUtils;
/**
 * SD卡相关工具类
 * <br>Created 2014-8-22 下午5:40:22
 * @version  1.0
 * @author   huangyx		
 * @see 	 
 * Copyright(c) 2009-2014, TQ Digital Entertainment, All Rights Reserved
 *
 */
public class SdCardUtils {

    /**
     * 返回SD卡跟目录
     * <br>Created 2014-8-22 下午5:41:22
     * @return SD卡跟目录
     * @author       huangyx
     */
	public static String getSdCardPath(){
		File sdDir = null;
		boolean sdCardExist = isSdCardExist();  //判断sd卡是否存在
		if (sdCardExist){
			sdDir = Environment.getExternalStorageDirectory();//获取跟目录
			return sdDir.toString();
		} else {
		    return null;
		}
	}
	
	/**
	 * 判断SD卡是否存在
	 * <br>Created 2014-8-22 下午5:42:24
	 * @return SD卡存在返回true，否则返回false
	 * @author       huangyx
	 */
	public static boolean isSdCardExist() {
		return Environment.getExternalStorageState()
		        .equals(Environment.MEDIA_MOUNTED);
	}
	
	/**
	 * 获取当前安装版本的apk文件的完整路径，返回空串表示查找失败
	 * <br>Created 2014-8-22 下午5:43:48
	 * @param ctx 上下文
	 * @return 返回当前安装版本的APK文件的完整路径，apk文件查找失败则返回空字符串
	 * @author       huangyx
	 */
	public static String getInstalledApkPath(Context ctx) {
		String packageName = ctx.getPackageName();

		PackageManager pm = ctx.getPackageManager();
		List<ApplicationInfo> packages = pm
				.getInstalledApplications(PackageManager.GET_META_DATA);
		if (packages == null) {
			return "";
		}

		for (ApplicationInfo packageInfo : packages) {
			if (packageName.equals(packageInfo.packageName)) {
				String apkFilePath = packageInfo.sourceDir;
				File apkFile = new File(apkFilePath);
				if (apkFile.exists()) {
					return apkFilePath;
				} else {
					return "";
				}
			}
		}

		return "";
	}
	
	/**
	 * 获得SD卡中应用程序数据目录
	 * <br>Created 2014-8-22 下午5:45:23
	 * @param ctx 上下文
	 * @return SD卡中应用程序数据目录，SD卡或者数据目录不存在则返回空字符串
	 * @author       huangyx
	 */
	public static String getSDCardCacheDir(Context ctx) {
		if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.FROYO) {
			if(ctx.getExternalCacheDir() == null) {
                return "";
            }
			return makesureFileSepInTheEnd(ctx.getExternalCacheDir().getPath());
		} else {
			if(!isSdCardExist()){
				return "";
			}
			
			return String.format(Locale.getDefault(),
					Environment.getExternalStorageDirectory()
							+ "/Android/data/%s/cache/", ctx.getPackageName());
		}
	}
	
	/**
	 * 获得内部存储中应用程序数据目录
	 * <br>Created 2014-8-22 下午5:46:35
	 * @param ctx 上下文
	 * @return 内部存储中应用程序数据目录，内部存储的数据目录不存在则返回空字符串
	 * @author       huangyx
	 */
	public static String getInternalStoreCacheDir(Context ctx) {
		File fCacheDir = ctx.getCacheDir();
		if(null == fCacheDir){
			return "";
		}
		return makesureFileSepInTheEnd(fCacheDir.getAbsolutePath());
	}
	
	/**
	 * 确保以斜杠结尾
	 * <br>Created 2014-8-22 下午5:48:12
	 * @param strDir 目录
	 * @return 以斜杠结尾的目录
	 * @author       huangyx
	 */
	private static String makesureFileSepInTheEnd(String strDir){
		if(!TextUtils.isEmpty(strDir)){
			//确保以斜杠结尾
			if(!strDir.endsWith(File.separator)){
				strDir += File.separator;
			}
		}
		return strDir;
	}
	
	/**
     * 判断是否为SD文件
     * <br>Created 2014-8-22 下午8:10:54
     * @param path 文件路径
     * @return 为SD文件返回true，否则返回false
     * @author       huangyx
     */
    public static boolean isLocalFile(String path){
        if (TextUtils.isEmpty(path)) {
            return false;
        }
        String mntpath = Environment.getExternalStorageDirectory().getAbsolutePath();
        return path.contains(mntpath);
    }
}
